package com.iocaop.security.demo02.config;


import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;

/**
 * security配置类
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 重写方法  自定义认证管理
     * @param auth
     * @throws Exception
     */
    @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            // 使用内存中的 InMemoryUserDetailsManager
            .inMemoryAuthentication()
            // 不使用 passwordEncoder 密码编辑器
            .passwordEncoder(NoOpPasswordEncoder.getInstance())
            // 配置用户
            .withUser("admin").password("admin").roles("ADMIN").and()
            .withUser("normal").password("normal").roles("NORMAL");
    }

    /**
     * 重写方法 配置权限
     * @param http
     * @throws Exception
     */
    @Override protected void configure(HttpSecurity http) throws Exception {
       http
           // 配置请求地址的权限
           .authorizeRequests()
           // 所有用户可以访问
           .antMatchers("/test/all").permitAll()
           // 正常用户可访问
           .antMatchers("test/normal").hasRole("NORMAL")
           // 管理员可访问
           .antMatchers("/test/admin").access("hasRole('ADMIN')")
           // 任何请丢都需要经过用户请求才能访问
           .anyRequest().authenticated()
           .and()
           // 配置登录页面的路径
           .formLogin().loginPage("/login").permitAll()
           // 配置登出url
           .and().logout().logoutUrl("/logout").permitAll();
    }
}
